////package server.main.utils;
////
////import org.apache.commons.lang.RandomStringUtils;
////import org.junit.Test;
////
////import java.time.LocalDateTime;
////import java.time.format.DateTimeFormatter;
////import java.util.HashSet;
////import java.util.Set;
////import java.util.UUID;
////import java.util.concurrent.CountDownLatch;
////
/////**
//// * @auther MingHsZzz
//// * @Date 2023/1/31  15:38
//// * @project main
//// * @description
//// */
////public class GenerateNumber {
////
////
////   public static String getUUID() {
////      String replaceUUID = UUID.randomUUID().toString().replace("-", "");
////      return replaceUUID;
////   }
////
////
////   public static String getByTime(){
////      //时间（精确到毫秒）
////      DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
////      String localDate = LocalDateTime.now().format(ofPattern);
////      //随机数
////      String randomNumeric = RandomStringUtils.randomNumeric(8);
////
////
////      return  randomNumeric;
////   }
////
////
////   @Test
////   public  void testuuid(){
////
//////      System.out.println(getUUID());
//////      for (int i = 0;i < 100;i++) {
//////
//////         System.out.println(i + "--" + getByTime());
//////      }
////
////      long l = System.currentTimeMillis();
////      System.out.println(l);
////
////
////   }
////}
////class GenerateNumberBySnowFlake {
////   /**
////    * 开始时间截 (2023-01-31)
////    */
////
////   private final long twepoch = 1675152067447L;
////
////   /**
////    * 机器id所占的位数
////    */
////   private final long workerIdBits = 5L;
////
////   /**
////    * 数据标识id所占的位数
////    */
////   private final long datacenterIdBits = 5L;
////
////   /**
////    * 支持的最大机器id，结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)
////    */
////   private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
////
////   /**
////    * 支持的最大数据标识id，结果是31
////    */
////   private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
////
////   /**
////    * 序列在id中占的位数
////    */
////   private final long sequenceBits = 12L;
////
////   /**
////    * 机器ID向左移12位
////    */
////   private final long workerIdShift = sequenceBits;
////
////   /**
////    * 数据标识id向左移17位(12+5)
////    */
////   private final long datacenterIdShift = sequenceBits + workerIdBits;
////
////   /**
////    * 时间截向左移22位(5+5+12)
////    */
////   private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
////
////   /**
////    * 生成序列的掩码，这里为4095 (0b111111111111=0xfff=4095)
////    */
////   private final long sequenceMask = -1L ^ (-1L << sequenceBits);
////
////   /**
////    * 工作机器ID(0~31)
////    */
////   private long workerId;
////
////   /**
////    * 数据中心ID(0~31)
////    */
////   private long datacenterId;
////
////   /**
////    * 毫秒内序列(0~4095)
////    */
////   private long sequence = 0L;
////
////   /**
////    * 上次生成ID的时间截
////    */
////   private long lastTimestamp = -1L;
////
////   private String flag = "NN";
////
////   //==============================Constructors=====================================
////
////   /**
////    * 构造函数
////    *
////    * @param workerId     工作ID (0~31)
////    * @param datacenterId 数据中心ID (0~31)
////    */
////   public GenerateNumberBySnowFlake(long workerId, long datacenterId,String flag) {
////      if (workerId > maxWorkerId || workerId < 0) {
////         throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
////      }
////      if (datacenterId > maxDatacenterId || datacenterId < 0) {
////         throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
////      }
////      this.workerId = workerId;
////      this.flag = flag;
////      this.datacenterId = datacenterId;
////   }
////
////   // ==============================Methods==========================================
////
////   /**
////    * 获得下一个ID (该方法是线程安全的)
////    *
////    * @return SnowflakeId
////    */
////   public synchronized long nextId() {
////      long timestamp = timeGen();
////
////      //如果当前时间小于上一次ID生成的时间戳，说明系统时钟回退过这个时候应当抛出异常
////      if (timestamp < lastTimestamp) {
////         throw new RuntimeException(
////                 String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
////      }
////
////      //如果是同一时间生成的，则进行毫秒内序列
////      if (lastTimestamp == timestamp) {
////         sequence = (sequence + 1) & sequenceMask;
////         //毫秒内序列溢出
////         if (sequence == 0) {
////            //阻塞到下一个毫秒,获得新的时间戳
////            timestamp = tilNextMillis(lastTimestamp);
////         }
////      }
////      //时间戳改变，毫秒内序列重置
////      else {
////         sequence = 0L;
////      }
////
////      //上次生成ID的时间截
////      lastTimestamp = timestamp;
////
////      //移位并通过或运算拼到一起组成64位的ID
////
////      return (((timestamp - twepoch) << timestampLeftShift)
////              | (datacenterId << datacenterIdShift)
////              | (workerId << workerIdShift)
////              | sequence);
////   }
////
////   public synchronized String genNumberByflag(){
////
////      long timestamp = timeGen();
////
////      //如果当前时间小于上一次ID生成的时间戳，说明系统时钟回退过这个时候应当抛出异常
////      if (timestamp < lastTimestamp) {
////         throw new RuntimeException(
////                 String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
////      }
////
////      //如果是同一时间生成的，则进行毫秒内序列
////      if (lastTimestamp == timestamp) {
////         sequence = (sequence + 1) & sequenceMask;
////         //毫秒内序列溢出
////         if (sequence == 0) {
////            //阻塞到下一个毫秒,获得新的时间戳
////            timestamp = tilNextMillis(lastTimestamp);
////         }
////      }
////      //时间戳改变，毫秒内序列重置
////      else {
////         sequence = 0L;
////      }
////
////      //上次生成ID的时间截
////      lastTimestamp = timestamp;
////
////      //移位并通过或运算拼到一起组成64位的ID
////
//////      Long l =  ;
////
////
////      return flag + (((timestamp - twepoch) << timestampLeftShift)
////              | (datacenterId << datacenterIdShift)
////              | (workerId << workerIdShift)
////              | sequence);
////   }
////
////
////   /**
////    * 阻塞到下一个毫秒，直到获得新的时间戳
////    *
////    * @param lastTimestamp 上次生成ID的时间截
////    * @return 当前时间戳
////    */
////   protected long tilNextMillis(long lastTimestamp) {
////      long timestamp = timeGen();
////      while (timestamp <= lastTimestamp) {
////         timestamp = timeGen();
////      }
////      return timestamp;
////   }
////
////   /**
////    * 返回以毫秒为单位的当前时间
////    *
////    * @return 当前时间(毫秒)
////    */
////   protected long timeGen() {
////      return System.currentTimeMillis();
////   }
////
//////   public synchronized String genNumberByflag(String flag){
//////      long snowflakeid = nextId();
//////
//////      return flag + snowflakeid;
//////   }
////
////   /**
////    * 测试
////    */
////
////
////   public static void main(String[] args) throws InterruptedException {
////      Set set = new HashSet();
////      CountDownLatch countDownLatch=new CountDownLatch(100);
////      GenerateNumberBySnowFlake generateNumberBySnowFlake = new GenerateNumberBySnowFlake(0, 0,"SX");
////      for (int i = 0;i < 100;i++) {
////         Thread thread = new Thread(()->{
////            for (int j = 0; j < 1000; j++) {
////               String s = generateNumberBySnowFlake.genNumberByflag();
//////               Long s = generateNumberBySnowFlake.nextId();
////               System.out.println(Thread.currentThread().getName() + "----------" + s);
////               set.add(s);
////            }
////            countDownLatch.countDown();
////         },"线程" + i);
////         thread.start();
////      }
////      countDownLatch.await();
////
//////      System.out.println(set);
////      System.out.println("set.size()" + set.size());
////   }
//////   public static void main(String[] args) {
//////      long startTime = System.currentTimeMillis();
//////      GenerateNumberBySnowFlake idWorker = new GenerateNumberBySnowFlake(0, 0);
//////      Set set = new HashSet();
//////      for (int i = 0; i < 100000; i++) {
//////         String id = idWorker.genNumberByflag("SX");
//////         set.add(id);
//////         System.out.println("id----"+i+":"+id);
//////      }
//////      long endTime = System.currentTimeMillis();
//////      System.out.println("set.size():" + set.size());
//////      System.out.println("endTime-startTime:" + (endTime - startTime));
//////   }
////}
//package server.main.utils;
//
//import org.apache.commons.lang.RandomStringUtils;
//import org.junit.Test;
//
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//import java.util.*;
//import java.util.concurrent.CountDownLatch;
//
///**
// * @auther MingHsZzz
// * @Date 2023/1/31  15:38
// * @project main
// * @description
// */
//public class GenerateNumber {
//
//
//   public static String getUUID() {
//      String replaceUUID = UUID.randomUUID().toString().replace("-", "");
//      return replaceUUID;
//   }
//
//
//   public static String getByTime(){
//      //时间（精确到毫秒）
//      DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
//      String localDate = LocalDateTime.now().format(ofPattern);
//      //随机数
//      String randomNumeric = RandomStringUtils.randomNumeric(8);
//
//
//      return  randomNumeric;
//   }
//
//
//   @Test
//   public  void testuuid(){
//
////      System.out.println(getUUID());
////      for (int i = 0;i < 100;i++) {
////
////         System.out.println(i + "--" + getByTime());
////      }
//
//      long l = System.currentTimeMillis();
//      System.out.println(l);
//
//
//   }
//}
//class GenerateNumberBySnowFlake {
//   /**
//    * 开始时间截 (2023-01-31)
//    */
//
//   private final long twepoch = 1675152067447L;
//
//   /**
//    * 机器id所占的位数
//    */
//   private final long workerIdBits = 10L;
//
//   /**
//    * 数据标识id所占的位数
//    */
//
//
//   /**
//    * 支持的最大机器id，结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)
//    */
//   private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
//
//   /**
//    * 支持的最大数据标识id，结果是31
//    */
//
//
//   /**
//    * 序列在id中占的位数
//    */
//   private final long sequenceBits = 12L;
//
//   /**
//    * 机器ID向左移12位
//    */
//   private final long workerIdShift = sequenceBits;
//
//   /**
//    * 数据标识id向左移17位(12+5)
//    */
//   private final long datacenterIdShift = sequenceBits + workerIdBits;
//
//   /**
//    * 时间截向左移22位(5+5+12)
//    */
//   private final long timestampLeftShift = sequenceBits + workerIdBits ;
//
//   /**
//    * 生成序列的掩码，这里为4095 (0b111111111111=0xfff=4095)
//    */
//   private final long sequenceMask = -1L ^ (-1L << sequenceBits);
//
//   /**
//    * 工作机器ID(0~31)
//    */
//   private long workerId;
//
//   /**
//    * 数据中心ID(0~31)
//    */
//   private long datacenterId;
//
//   /**
//    * 毫秒内序列(0~4095)
//    */
//   private long sequence = 0L;
//
//   /**
//    * 上次生成ID的时间截
//    */
//   private long lastTimestamp = -1L;
//
//   private String flag = "NN";
//
//   //==============================Constructors=====================================
//
//   /**
//    * 构造函数
//    *
//    * @param workerId     工作ID (0~2^10)
//    */
//   public GenerateNumberBySnowFlake(long workerId,String flag) {
//      if (workerId < 0) {
//         throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
//      }
//      if(workerId > maxWorkerId){
//         workerId = workerId-((workerId>>workerIdBits)<<workerIdBits);
//      }
//      this.workerId = workerId;
//      this.flag = flag;
//   }
//
//   // ==============================Methods==========================================
//
//   /**
//    * 获得下一个ID (该方法是线程安全的)
//    *
//    * @return SnowflakeId
//    */
//   public synchronized long nextId() {
//      long timestamp = timeGen();
//
//      //如果当前时间小于上一次ID生成的时间戳，说明系统时钟回退过这个时候应当抛出异常
//      if (timestamp < lastTimestamp) {
//         throw new RuntimeException(
//                 String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
//      }
//
//      //如果是同一时间生成的，则进行毫秒内序列
//      if (lastTimestamp == timestamp) {
//         sequence = (sequence + 1) & sequenceMask;
//         //毫秒内序列溢出
//         if (sequence == 0) {
//            //阻塞到下一个毫秒,获得新的时间戳
//            timestamp = tilNextMillis(lastTimestamp);
//         }
//      }
//      //时间戳改变，毫秒内序列重置
//      else {
//         sequence = 0L;
//      }
//
//      //上次生成ID的时间截
//      lastTimestamp = timestamp;
//
//      //移位并通过或运算拼到一起组成64位的ID
//
//      return (((timestamp - twepoch) << timestampLeftShift)
//              | (datacenterId << datacenterIdShift)
//              | (workerId << workerIdShift)
//              | sequence);
//   }
//
//   public synchronized String genNumberByflag(){
//
//      long timestamp = timeGen();
//
//      //如果当前时间小于上一次ID生成的时间戳，说明系统时钟回退过这个时候应当抛出异常
//      if (timestamp < lastTimestamp) {
//         throw new RuntimeException(
//                 String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
//      }
//
//      //如果是同一时间生成的，则进行毫秒内序列
//      if (lastTimestamp == timestamp) {
//         sequence = (sequence + 1) & sequenceMask;
//         //毫秒内序列溢出
//         if (sequence == 0) {
//            //阻塞到下一个毫秒,获得新的时间戳
//            timestamp = tilNextMillis(lastTimestamp);
//         }
//      }
//      //时间戳改变，毫秒内序列重置
//      else {
//         sequence = 0L;
//      }
//
//      //上次生成ID的时间截
//      lastTimestamp = timestamp;
//
//      //移位并通过或运算拼到一起组成64位的ID
//
////      Long l =  ;
//
//
//      return flag + (((timestamp - twepoch) << timestampLeftShift)
//              | (datacenterId << datacenterIdShift)
//              | (workerId << workerIdShift)
//              | sequence);
//   }
//
//
//   /**
//    * 阻塞到下一个毫秒，直到获得新的时间戳
//    *
//    * @param lastTimestamp 上次生成ID的时间截
//    * @return 当前时间戳
//    */
//   protected long tilNextMillis(long lastTimestamp) {
//      long timestamp = timeGen();
//      while (timestamp <= lastTimestamp) {
//         timestamp = timeGen();
//      }
//      return timestamp;
//   }
//
//   /**
//    * 返回以毫秒为单位的当前时间
//    *
//    * @return 当前时间(毫秒)
//    */
//   protected long timeGen() {
//      return System.currentTimeMillis();
//   }
//
////   public synchronized String genNumberByflag(String flag){
////      long snowflakeid = nextId();
////
////      return flag + snowflakeid;
////   }
//
//   /**
//    * 测试
//    */
//
//
//   public static void main(String[] args) throws InterruptedException {
//      Set set = new HashSet();
//      long l = System.currentTimeMillis();
//      CountDownLatch countDownLatch=new CountDownLatch(100000);
//      Set<Integer> list = new HashSet<>();
//      for (int i = 0;i < 100000;i++) {
//         Thread thread = new Thread(()->{
//            int i1 = new Random().nextInt();
//            while(list.contains(i1)){
//               i1 = new Random().nextInt(10000000);
//            }
//
//            list.add(i1);
//            GenerateNumberBySnowFlake generateNumberBySnowFlake = new GenerateNumberBySnowFlake(i1,"SX");
//            for (int j = 0; j < 1; j++) {
//               String s = generateNumberBySnowFlake.genNumberByflag();
////               Long s = generateNumberBySnowFlake.nextId();
//               System.out.println(Thread.currentThread().getName() + "----------" + s);
//               set.add(s);
//            }
//            countDownLatch.countDown();
//         },"线程" + i);
//         thread.start();
//      }
//      countDownLatch.await();
//      long l1 = System.currentTimeMillis();
////      for (Integer integer : list) {
////         System.out.println(integer);
////      }
////      System.out.println(set);
//      System.out.println(l1 - l);
//      System.out.println("set.size()" + set.size());
//      System.out.println("list.size()" + list.size());
//   }
//
//
//
////   public static void main(String[] args) {
////      long startTime = System.currentTimeMillis();
////      GenerateNumberBySnowFlake idWorker = new GenerateNumberBySnowFlake(0, 0);
////      Set set = new HashSet();
////      for (int i = 0; i < 100000; i++) {
////         String id = idWorker.genNumberByflag("SX");
////         set.add(id);
////         System.out.println("id----"+i+":"+id);
////      }
////      long endTime = System.currentTimeMillis();
////      System.out.println("set.size():" + set.size());
////      System.out.println("endTime-startTime:" + (endTime - startTime));
////   }
//}
